18953
6887
Jeg har en liste over gange i sekunder som:
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
For hvert vindue med en længde på 2 sekunder, der starter ved en anden grænse, vil jeg gerne udsende en liste over alle de tidspunkter, der falder inden for det andet vindue. Så for ovenstående eksempel ville det være:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Generelt kan vindueslængden være forskellig fra 2.
Hvordan kan du gøre dette? 
Jeg tror, ​​du mente stigning baseret på "For hvert vindues længde 2 sekunder, der starter ved en anden grænse" og ikke overlapper hinanden. I to sekunders intervaller er det det samme, men da du vil variere længden, vil en overlapning på et sekund være 0-3, 2-5, 4-7, men inkrement vil betyde 0-3, 1-4, 2- 5. Det var dog interessant at finde ud af løsninger til begge dele i tilfælde af.
Forudsat at L er sorteret, og alle elementer er positive, og at de andet intervaller alle starter med heltal, kan vi bruge denne metode:
importer matematik
fra samlinger importerer standarddikt
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (liste)
interval_bredde = 2
for x i L:
upper_bound = math.ceil (x)
nedre_bundet = upper_bound - interval_width
lower_bound = max (0, lower_bound)
for y inden for rækkevidde (nedre_bundet, upper_bound):
my_ranges [y] .append (x)
for en sorteret (mine_ranger):
udskrive (mine_ranger [a])
Jeg ved ikke, om du vil se, om der er tomme intervaller. Men defaultdict udskriver tomme områder, hvis du også vil. Brug denne linje i stedet for "for a in sorted":
for en inden for rækkevidde (min (mine_ranger), maks (mine_ranger) + 1):
Hvis du ville have intervallerne 0-3, 2-5, 4-7, fungerer dette:
importer matematik
fra samlinger importerer standarddikt
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
interval_bredde = 2
my_ranges_2 = defaultdict (liste)
for x i L:
bestemt_in = (x // (interval_bredde - 1)) * (interval_bredde - 1) # laveste multiplum af interval_bredde under x vil altid være i
#print ("Tilføjelse", x, "til", bestemt_in)
my_ranges_2 [bestemt_in] .append (x)
hvis x  = 0: # for eksempel, hvis x er 2.3, og vi har 0,3 2,5 osv. ... er vi nødt til at fange dette duplikat. Jeg antager, at vindueslængderne er heltal, og hvis ikke, har vi meget mere at gøre, fordi antallet muligvis går i mere end en matrix. Måske kunne vi have en stund-løkke, stigende med (interval_bredde - 1)
#print ("++ Tilføjelse", x, "til", bestemt_in - interval_bredde + 1)
my_ranges_2 [bestemt_in - interval_width + 1] .append (x)
for en i sorteret (my_ranges_2):
udskriv (a, my_ranges_2 [a])
# print (my_ranges_2 [a])
Jeg formoder, at der er nogle detaljer, som jeg har glemt, men forhåbentlig kan du twiddle interval_width efter behov for at sikre, at min kode gør, hvad du håbede, og lad mig vide, hvad du netop har brug for.
|
En mulig løsning, som jeg kan foreslå, er "effektiv" på en måde, at den kun gentager én gang gennem inputdataene og ikke har nogen afhængighed. Omkostningerne er selvfølgelig, at den er skrevet i ren python (der kan være mere optimeret kode), og at den introducerer flere sporingsvariabler for at forhindre gentagelse (og dermed er mindre pythonisk).
def sliding_window (data, varighed, start = 0, overlapning = 1):
resultat = []
data_idx = 0
resultat_idx = 0
øvre = start + varighed
lavere = start
next_lower = øvre - overlapning
# indre hjælper til at putte tomme indre lister op til vores indsætningspunkt og indsæt
def pad_and_append (at):
mens len (resultat) <= ved:
resultat.append ([])
resultat [ved] .append (data [data_idx])
# iterere gennem inputdata
mens data_idx  a:
hvis x  = l [0]) & (L  = i) & (L